package com.yuxi.al.leercode;

/**
 * 把所有的0移动到末尾
 * Created by yuxi on 2017/4/6.
 */
public class MoveZeroes {
    public static void main(String[] args) {
        int[] arr = {0, 2, 4, 0, 3, 3, 0, 23, 0, 4, 4, 0, 0};
        moveZeroes(arr);

        moveZeroesTwo(arr);
    }

    /**
     * 我的操作 感觉也还满好的呀！！ 两个指针一个指向头部，一个指向尾部，如果发现0就互换位置
     * @param arr
     */
    private static void moveZeroesTwo(int[] arr) {
        int start = 0;
        int end = arr.length - 1;
        if (arr == null || arr.length == 0) return;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != 0) {
                start++;
            } else {
                //先判断一下end的值是不是本来就是0
                if (arr[end]==0){
                    end--;
                }
                int tmp = arr[end];
                arr[end] = arr[start];
                end--;
                arr[i] = tmp;
                start++;
            }
//            //为了早点跳出循环
            if (end<=start){
                break;
            }
        }
        System.out.println("----");
        for (int i : arr) {
            System.out.print(i + "-->");
        }

    }

    /**
     * 大神级操作，原理很简单，就是将所有的非0元素移动到右边，然后0为0的元素往后靠
     *
     * @param nums
     */
    private static void moveZeroes(int[] nums) {
        if (nums == null || nums.length == 0) return;

        int insertPos = 0;
        for (int num : nums) {
            if (num != 0)
                nums[insertPos++] = num;
        }

        while (insertPos < nums.length) {
            nums[insertPos++] = 0;
        }

        for (int num : nums) {
            System.out.print(num + "-->");
        }
    }
}
